/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package pittypat;

import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

/**
 * 表示某个用户的导航列表。
 */
public class NavList implements IComplex {
	/**
	 * 表示一个空的导航列表，这是一个只读字段。
	 */
	public static final NavList EMPTY = new NavList(null);

	// 一个空的导航 App 项目集合
	private static final List<INavApp> EMPTY_APPS = new ArrayList<INavApp>();

	private List<INavApp> apps;

	/**
	 * 使用 INavApp 列表初始化 NavList 的新实例。
	 * 
	 * @param apps
	 *            INavApp 列表。
	 */
	public NavList(List<INavApp> apps) {
		this.apps = apps == null ? EMPTY_APPS : apps;
	}

	/**
	 * 获取用户有权限访问和使用的 INavApp 的列表。
	 * 
	 * @return 用户有权限访问和使用的 INavApp 的列表。
	 */
	public List<INavApp> getApps() {
		return this.apps;
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 *            目标文本流。 throws IllegalArgumentException writer 为 null。
	 */
	@Override
	public void write(Writer writer) throws IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write('[');

		if (this.apps.size() > 0) {
			List<INavApp> list = new ArrayList<INavApp>(this.apps.size());

			// 排除 null 元素
			for (INavApp app : this.apps) {
				if (app != null) {
					list.add(app);
				}
			}

			for (int i = 0; i < list.size(); ++i) {
				list.get(i).write(writer);

				if (i < list.size() - 1) {
					writer.write(',');
				}
			}
		}

		writer.write(']');
	}
}
